/*
 * sys.h
 * 系统初始化相关头文件
 * 提供系统级函数声明，如时钟配置、中断控制、复位管理等
 */

#ifndef _SYS_H
#define _SYS_H

#include "stm32f0xx.h"     /* 包含STM32F0系列芯片定义头文件 */
#include "stm32f0xx_hal.h" /* 包含STM32F0系列HAL库头文件 */

/**
 * @brief   系统是否支持操作系统配置宏
 * @note    0：不支持操作系统
 *          1：支持操作系统
 */
#define SYS_SUPPORT_OS         0  /* 当前配置为不支持操作系统 */

/* 函数声明 *******************************************************************************/

/**
 * @brief   设置中断向量表
 * @param   baseaddr: 中断向量表基地址
 * @param   offset: 中断向量表偏移量
 * @retval  无
 */
void sys_nvic_set_vector_table(uint32_t baseaddr, uint32_t offset);  /* 设置中断向量表 */

/**
 * @brief   进入待机模式
 * @note    待机模式是STM32的最低功耗模式之一
 * @param   无
 * @retval  无
 */
void sys_standby(void);                                              /* 进入待机模式 */

/**
 * @brief   系统软件复位
 * @note    通过软件触发系统复位，相当于重启系统
 * @param   无
 * @retval  无
 */
void sys_soft_reset(void);                                           /* 系统软复位 */

/**
 * @brief   配置系统时钟
 * @param   plln: PLL1倍频系数(PLL倍频)
 * @param   pllm: PLL1预分频系数(进入PLL之前的分频)
 * @param   pllp: PLL1的p分频系数(PLL之后的分频，用于系统时钟)
 * @param   pllq: PLL1的q分频系数(PLL之后的分频)
 * @retval  初始化结果：0-成功；1-失败
 * @note    计算关系：
 *          Fvco = Fs * (plln / pllm);         // VCO频率
 *          Fsys = Fvco / pllp;                // 系统时钟频率
 *          Fq = Fvco / pllq;                  // PLL1的q输出时钟频率
 */
uint8_t sys_stm32_clock_init(uint32_t plln, uint32_t pllm, uint32_t pllp, uint32_t pllq);  /* 配置系统时钟 */

/* 以下为汇编函数 */

/**
 * @brief   执行WFI指令
 * @note    WFI(Wait For Interrupt)指令会使CPU进入低功耗模式，直到有中断发生
 * @param   无
 * @retval  无
 */
void sys_wfi_set(void);             /* 执行WFI指令 */

/**
 * @brief   关闭所有中断
 * @note    不包括fault和NMI中断
 * @param   无
 * @retval  无
 */
void sys_intx_disable(void);        /* 关闭所有中断 */

/**
 * @brief   开启所有中断
 * @param   无
 * @retval  无
 */
void sys_intx_enable(void);         /* 开启所有中断 */

/**
 * @brief   设置堆栈指针地址
 * @note    在编译器层面(X编译器)，实际几乎用不到
 * @param   addr: 堆栈指针地址
 * @retval  无
 */
void sys_msr_msp(uint32_t addr);    /* 设置堆栈指针地址 */

#endif
